
#include "nane/SerializeSystem/cfg/CfgSerializationProtocol.h"
#include "nane/core/IFileSystem.h"
#include "nane/core/IO.h"

#include <cassert>
#include <cstdio>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    CfgSerializationProtocol::CfgSerializationProtocol( const OutputPtr& _output )
        : m_output( _output )
    {
        assert( m_output != NullPtr );
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    CfgSerializationProtocol::~CfgSerializationProtocol()
    {

    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag )
    {
        IO<IOUnsafe>::Write(m_output.Get(), '[');
        IO<IOUnsafe>::Write(m_output.Get(), _tag);
        IO<IOUnsafe>::Write(m_output.Get(), "]\n");
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag, int32 _data )
    {
        char buffer[16];
        sprintf( buffer, "%d", _data );
        return Serialize(_tag, buffer);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag, uint32 _data )
    {
        char buffer[16];
        sprintf( buffer, "%u", _data );
        return Serialize(_tag, buffer);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag, float _data )
    {
        char buffer[16];
        sprintf( buffer, "%f", _data );
        return Serialize(_tag, buffer);
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag, bool _data )
    {
        return _data == true ? Serialize(_tag, "true") : Serialize(_tag, "false");
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool CfgSerializationProtocol::Serialize( const char* _tag, const char* _data )
    {
        IO<IOUnsafe>::Write(m_output.Get(), _tag);
        IO<IOUnsafe>::Write(m_output.Get(), " = ");
        IO<IOUnsafe>::Writeln(m_output.Get(), _data);
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane
